package cn.cj.erp.service.base;

import cn.cj.erp.common.Page;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.additional.query.impl.QueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.additional.update.impl.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.service.additional.update.impl.UpdateChainWrapper;

import java.util.List;

/**
 * 基础Service接口
 *
 * @author jianchen
 * @version 1.0.0
 * @date 2024/8/1
 */
public interface BaseService<Entity, Bo> extends ServiceConverter<Entity, Bo> {
    /**
     * 获取Mapper
     * @return Mapper Bean
     */
    BaseMapper<Entity> getBaseMapper();

    /**
     * 分页查询
     *
     * @param params 分页查询参数
     * @return Page
     */
    Page<Bo> queryPage(Bo params);

    /**
     * 列表查询
     * @param params 查询参数
     * @return List
     */
    List<Bo> queryList(Bo params);

    /**
     * 插入一条记录
     *
     * @param bo bo对象
     * @return true-插入成功，false-插入失败
     */
    boolean save(Bo bo);

    /**
     * 插入（批量）
     *
     * @param boList bo对象集合
     * @return true-插入成功，false-插入失败
     */
    boolean saveBatch(List<Bo> boList);

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     * @return true-删除成功，false-删除失败
     */
    boolean removeById(Long id);

    /**
     * 删除（根据ID 批量删除）
     *
     * @param ids 主键ID列表
     * @return true-删除成功，false-删除失败
     */
    boolean removeByIds(List<Long> ids);

    /**
     * 根据 ID 选择修改
     *
     * @param bo bo对象
     * @return true-修改成功，false-修改失败
     */
    boolean updateById(Bo bo);

    /**
     * 根据ID 批量更新
     *
     * @param boList bo对象集合
     * @return true-修改成功，false-修改失败
     */
    boolean updateBatchById(List<Bo> boList);

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     * @return bo对象
     */
    Bo getById(Long id);

    /**
     * 查询（根据ID 批量查询）
     *
     * @param ids 主键ID列表
     * @return bo对象列表
     */
    List<Bo> listByIds(List<Long> ids);

    /**
     * 链式查询 普通
     *
     * @return QueryWrapper 的包装类
     */
    default QueryChainWrapper<Entity> query() {
        return new QueryChainWrapper<>(getBaseMapper());
    }

    /**
     * 链式查询 lambda 式
     * <p>注意：不支持 Kotlin </p>
     *
     * @return LambdaQueryWrapper 的包装类
     */
    default LambdaQueryChainWrapper<Entity> lambdaQuery() {
        return new LambdaQueryChainWrapper<>(getBaseMapper());
    }

    /**
     * 链式更改 普通
     *
     * @return UpdateWrapper 的包装类
     */
    default UpdateChainWrapper<Entity> update() {
        return new UpdateChainWrapper<>(getBaseMapper());
    }

    /**
     * 链式更改 lambda 式
     * <p>注意：不支持 Kotlin </p>
     *
     * @return LambdaUpdateWrapper 的包装类
     */
    default LambdaUpdateChainWrapper<Entity> lambdaUpdate() {
        return new LambdaUpdateChainWrapper<>(getBaseMapper());
    }
}